#include <iostream>
#include <string>
// #include <thread>
#include <pthread.h>
#include <unistd.h>

void showtid(pthread_t &tid)
{
    printf("tid: 0x%lx\n", tid);
}

std::string FormateId(const pthread_t &tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);
    return id;
}

void *routine(void *args)
{
    std::string name = static_cast<const char *>(args);
    pthread_t tid = pthread_self();
    int cnt = 5;
    while (cnt)
    {
        std::cout << "我是新线程：我的名字是：" << name << "我的ID是" << FormateId(tid) << std::endl;
        sleep(1);
        cnt--;
    }
    return (void*)100;//暂时可当做退出状态码
}

int main()
{
    pthread_t tid;
    int n = pthread_create(&tid, nullptr, routine, (void *)"thread-1");
    (void)n;

    showtid(tid);

    int cnt = 5;
    while (cnt)
    {
        std::cout << "我是主线程：我的名字是main thread, " << "我的ID是" << FormateId(pthread_self()) << std::endl;
        sleep(1);
        cnt--;
    }

    void *ret = nullptr;
    pthread_join(tid, &ret);//取ret的地址，传址

    std::cout << "线程退出状态码：" << (long long int)ret << std::endl;

    return 0;
}

// void hello()
// {
//     while (true)
//     {
//         std::cout << "新线程: Hello, world!, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     std::thread t(hello);

//     while (true)
//     {
//         std::cout << "我是主线程... ,pid:" << getpid() << std::endl;
//         sleep(1);
//     }

//     t.join();
//     return 0;
// }

// void *threadrun(void *args)
// {
//     std::string name = (const char *)args;
//     while (true)
//     {
//         /* code */
//         std::cout << "我是新线程：name:" << name << ",pid:" << getpid() << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void *)"Thread-1");

//     while (true)
//     {
//         std::cout << "我是主线程" << ",pid:" << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }